#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <sys/wait.h>
#include <signal.h>
#include <time.h>
using namespace std;
/*信号灯控制用的共同体*/
typedef union semuns {
	int val;
} Sem_uns;

//信号量
class Sema{
	public:
		Sema(int id);
		~Sema();
		int down(); //信号量加 1
		int up(); //信号量减 1
	private:
		int sem_id; //信号量标识符
};
//哲学家管程中使用的锁
class Lock{
	public:
		Lock(Sema *lock);
		~Lock();
		void close_lock();
		void open_lock();
private:
		Sema *sema; //锁使用的信号量
};

/*
 * get_ipc_id() 从/proc/sysvipc/文件系统中获取 IPC 的 id 号
 * pfile: 对应/proc/sysvipc/目录中的 IPC 文件分别为
 * msg-消息队列,sem-信号量,shm-共享内存
 * key: 对应要获取的 IPC 的 id 号的键值
 */
int get_ipc_id(const char *proc_file,key_t key);
/*
* set_sem 函数建立一个具有 n 个信号灯的信号量
* 如果建立成功,返回 一个信号量的标识符 sem_id
* 输入参数:
* sem_key 信号量的键值
* sem_val 信号量中信号灯的个数
* sem_flag 信号量的存取权限
*/
int set_sem(key_t sem_key,int sem_val,int sem_flg);

/*
 * set_shm 函数建立一个具有 n 个字节 的共享内存区
 * 如果建立成功,返回 一个指向该内存区首地址的指针 shm_buf
 * 输入参数:
 * shm_key 共享内存的键值
 * shm_val 共享内存字节的长度
 * shm_flag 共享内存的存取权限
 */
char * set_shm(key_t shm_key,int shm_num,int shm_flg);



